<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        /*
            小总结:
                1.类中的构造器不是必须写的, 当你要对实例进行一些初始化的操作比如指定属性时才写
                2.如果A类继承了B类, 并且A类中写了构造器constructor, 那么A类的构造器中必须调用super()
                3.类中定义的方法其实是放在了类的原型对象上面
        */
        class Parent {
            // 构造器方法----用于对类进行初始化操作。
            constructor(name, age) {
                // 构造器中的this指向的就是这个类未来的实例对象
                this.name = name
                this.age = age
            }

            //一般方法,注意不要写成function speak()
            speak(){
                // 像这种一般方法会被放在这个类的prototype上,供实例使用
                console.log(`我是${this.name},我${this.age}岁了`)
            }

        }

        class child extends Parent{
            constructor(name,age,grade){
                super(name,age)
                this.grade = grade
            }

            // 子类可以对于父类中已有的方法进行重写
            speak(){
                console.log(`我是${this.name},我${this.age}岁了,在读${this.grade}年级`)
            }

            // 子类也可以添加新的方法
            newfun(){
                console.log('我是子类的新方法')
            }
        }

        //创建了一个Parent类的实例对象
        let p1 = new Parent('zs', 22)
    </script>
</body>

</html>